#ifndef CURVEPLOT_H
#define CURVEPLOT_H

#include <QObject>
#include <QWidget>
#include "qcustomplot.h"

#include <QTimer>
#include <QVector>
#include <QMap>
#include <QVariantMap>

#include "timeseriesstorage.h"
#include "tracermanager.h"

class CurvePlot : public QWidget
{
    Q_OBJECT

//    Q_PROPERTY(bool selected MEMBER m_selected NOTIFY selectedChanged)
public:
    explicit CurvePlot(QWidget *parent = nullptr);
    ~CurvePlot();

    // 添加曲线
    QCPGraph *addCurver(const QString &curverName);

    // 删除曲线
    void removeCurver(const QString &curverName);

    // 添加数据
    void addData(const QString &curverName, const double &x, const double &y);
    void addData(const QString &curverName, const QVector<double> &x, const QVector<double> &y);

    // 获取图表信息，曲线信息
    QVariantMap getCurveInfo() const;

    // 清空图表
    void removeAll();


    //获取图表类
    QCustomPlot *customPlot() const;
    void setCustomPlot(QCustomPlot *customPlot);

    // 获取图表名称
    QString name() const;
    void setName(const QString &name);

    // 获取曲线集合
    QMap<QString, QCPGraph *> Curvers() const;
    void setCurvers(const QMap<QString, QCPGraph *> &Curvers);

    // 自动滚动
    bool adjustXAxisRange(QCustomPlot *customPlot, double xValue, bool autoRefresh = false);
signals:
    void dataEmptied(QWidget *delWidget);   // 数据清空，将
public slots:
    // 开启定时器
    void startTimer();
    void stopTimer();
    /** 启停 刷新 */
    void setRunStatus(bool status);

    /** 注入数据 */
    void injectionData();

    /** 界面刷新定时器 */
    void replotTimer_timeout();

    /** 图例与曲线同步选中 */
    void selectionChanged();

    /** 设置数据缓冲区大小，同时会裁减删除超出区间的数据*/
    void setDataBufferSize(const QCPRange &newRange);

    /** 刷新 */
    void replotQueue(bool b = true);

private:
    // 数据存储
    QMap<QString, QCPGraph *> m_Curvers;    // 当前存在的曲线

    TimeSeriesStorage *m_dataBuffer;// 数据缓冲区

    int m_dataMaxLen = 100;   // 当前显示数据的区间

    bool m_runStatus;    //运行状态
    int m_intervalTime = 33; // 刷新的频率 33ms --- 大约30 FPS/s
    QTimer *m_replotTimer;      /** 界面刷新定时器 */


    QCustomPlot *m_customPlot;  // 图表类
    QFont m_axisFont;   // 图表标签字体
    QString m_name; // 图表名称

    TracerManager *m_tracerManager; // 游标管理类
};

#endif // CURVEPLOT_H
